/**
 * 工具函数实现文件
 * 主要功能：
 * 1. JNI字符串转换
 * 2. 工具函数实现
 * 
 * @author lenovo
 * @date 2021/3/22
 */

// 1. 包含系统头文件
#include <jni.h>      // JNI接口
#include <stdio.h>    // 标准输入输出
#include <stdlib.h>   // 标准库函数
#include <stdarg.h>   // 可变参数
#include <string.h>   // 字符串处理
#include "utils.h"    // 自定义头文件

/**
 * 2. JNI字符串转换函数
 * 将Java字符串转换为C字符串（GB2312编码）
 * 
 * @param env JNI环境指针
 * @param jstr Java字符串对象
 * @return char* C字符串指针
 */
char *jstringToChar(JNIEnv *env, jstring jstr) {
    // 2.1 初始化变量
    char *rtn = NULL;  // 返回值
    jclass clsstring = (*env)->FindClass(env, "java/lang/String");  // 获取String类
    jstring strencode = (*env)->NewStringUTF(env, "GB2312");        // 创建编码字符串
    jmethodID mid = (*env)->GetMethodID(env, clsstring, "getBytes", "(Ljava/lang/String;)[B");  // 获取getBytes方法ID
    jbyteArray barr = (jbyteArray) (*env)->CallObjectMethod(env, jstr, mid, strencode);  // 调用getBytes方法
    jsize alen = (*env)->GetArrayLength(env, barr);  // 获取字节数组长度
    jbyte *ba = (*env)->GetByteArrayElements(env, barr, JNI_FALSE);  // 获取字节数组元素

    // 2.2 转换字符串
    if (alen > 0) {
        rtn = (char *) malloc(alen + 1);  // 分配内存
        memcpy(rtn, ba, alen);            // 复制数据
        rtn[alen] = '\0';                 // 添加结束符
    }

    // 2.3 释放资源
    (*env)->ReleaseByteArrayElements(env, barr, ba, 0);  // 释放字节数组
    return rtn;  // 返回结果
}